
var Datastore = require('nedb')

function PeerMessageDB(filename) {
    this.db = new Datastore({filename:filename});
    this.db.loadDatabase();
}

PeerMessageDB.prototype.saveMessage = function(msg, cb) {
    if (cb) {
        this.db.insert(msg, function(err, newMsg) {
            msg.msgLocalID = newMsg._id;
            cb(msg);
        });
    } else {
        var self = this;
        return new Promise(function(resolve, reject) {
            self.db.insert(msg, function(err, newMsg) {
                msg.msgLocalID = newMsg._id;
                resolve(msg)
            });
        });
    }
}

PeerMessageDB.prototype.loadMessages = function(uid, cb) {
    this.db.find({peer:uid}).sort({timestamp:1}).exec(function(err, msgs) {
        for (var i = 0; i < msgs.length; i++) {
            msgs[i].msgLocalID = msgs[i]._id;
        }
        if (err) {
            cb([]);
        } else {
            cb(msgs);
        }
    });
}

PeerMessageDB.prototype.ackMessage = function(id) {
    this.db.update({_id:id}, {$set : {ack:true}}, {},
                   function(err, numReplaced) {
                       if (err) {
                           return;
                       }
                       console.log("update " + id + " success");

                   });
}

PeerMessageDB.prototype.setError = function(id, error) {
    this.db.update({_id:id}, {$set : {error:error}}, {},
                   function(err, numReplaced) {
                       if (err) {
                           return;
                       }
                       console.log("update " + id + " success");

                   });
}

PeerMessageDB.prototype.setCanceled = function(id, canceled) {
    this.db.update({_id:id}, {$set : {canceled:canceled}}, {},
                   function(err, numReplaced) {
                       if (err) {
                           return;
                       }
                       console.log("update " + id + " success");

                   });
}

PeerMessageDB.prototype.updateContent = function(id, content, contentObj) {
    this.db.update({_id:id}, {$set : {content:content, contentObj:contentObj}}, {},
                   function(err, numReplaced) {
                       if (err) {
                           return;
                       }
                       console.log("update " + id + " success");
                   });
}

module.exports = PeerMessageDB;
